home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 2005 October
/
PCWOCT05.iso
/
Software
/
FromTheMag
/
XAMPP 1.4.14
/
xampp-win32-1.4.14-installer.exe
/
xampp
/
php
/
pear
/
HTML
/
MenuBrowser.php
< prev
next >
Wrap
PHP Script
|
2004-03-24
|
8KB
|
275 lines
<?php
//
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2003 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Ulf Wendel <ulf.wendel@phpdoc.de> |
// +----------------------------------------------------------------------+
//
// $Id: MenuBrowser.php,v 1.4 2003/09/15 17:24:38 avb Exp $
/**
* Simple filesystem browser that can be used to generated menu (3) hashes based on the directory structure.
*
* Together with menu (3) and the (userland) cache you can use this
* browser to generate simple fusebox like applications / content systems.
*
* Let the menubrowser scan your document root and generate a menu (3) structure
* hash which maps the directory structure, pass it to menu's setMethod() and optionally
* wrap the cache around all this to save script runs. If you do so, it looks
* like this:
*
* // document root directory
* define('DOC_ROOT', '/home/server/www.example.com/');
*
* // instantiate the menubrowser
* $browser = new menubrowser(DOC_ROOT);
*
* // instantiate menu (3)
* $menu = new menu($browser->getMenu());
*
* // output the sitemap
* $menu->show('sitemap');
*
* Now, use e.g. simple XML files to store your content and additional menu informations
* (title!). Subclass exploreFile() depending on your file format.
*
* @author Ulf Wendel <ulf.wendel@phpdoc.de>
* @version $Revision: 1.4 $
* @package HTML_Menu
*/
class HTML_MenuBrowser
{
/**
* Filesuffix of your XML files.
*
* @var string
* @see HTML_MenuBrowser()
*/
var $file_suffix = 'xml';
/**
* Number of characters of the file suffix.
*
* @var int
* @see HTML_MenuBrowser()
*/
var $file_suffix_length = 3;
/**
* Filename (without suffix) of your index / start pages.
*
* @var string
* @see HTML_MenuBrowser()
*/
var $index = 'index';
/**
* Full filename of your index / start pages.
*
* @var string
* @see $file_suffix, $index
*/
var $index_file = '';
/**
* Directory to scan.
*
* @var string
* @see setDirectory()
*/
var $dir = '';
/**
* Prefix for every menu hash entry.
*
* Set the ID prefix if you want to merge the browser menu
* hash with another (static) menu hash so that there're no
* name clashes with the ids.
*
* @var string
* @see setIDPrefix()
*/
var $id_prefix = '';
/**
* Menu (3)'s setMenu() hash.
*
* @var array
*/
var $menu = array();
/**
* Creates the object and optionally sets the directory to scan.
*
* @param string Directory to scan
* @param string Filename of index pages
* @param string Suffix for files containing the additional data
* @see $dir
*/
function HTML_MenuBrowser($dir = '', $index = '', $file_suffix = '')
{
if ($dir) {
$this->dir = $dir;
}
if ($index) {
$this->index = $index;
}
if ($file_suffix) {
$this->file_suffix = $file_suffix;
}
$this->index_file = $this->index . '.' . $this->file_suffix;
$this->file_suffix_length = strlen($this->file_suffix);
}
/**
* Sets the directory to scan.
*
* @param string directory to scan
* @access public
*/
function setDirectory($dir)
{
$this->dir = $dir;
}
/**
* Sets the prefix for every id in the menu hash.
*
* @param string
* @access public
*/
function setIDPrefix($prefix)
{
$this->id_prefix = $prefix;
}
/**
* Returns a hash to be used with menu(3)'s setMenu().
*
* @param string directory to scan
* @param string id prefix
* @access public
*/
function getMenu($dir = '', $prefix = '')
{
if ($dir) {
$this->setDirectory($dir);
}
if ($prefix) {
$this->setIDPrefix($prefix);
}
// drop the result of previous runs
$this->files = array();
$this->menu = $this->browse($this->dir);
$this->menu = $this->addFileInfo($this->menu);
return $this->menu;
}
/**
* Recursive function that does the scan and builds the menu (3) hash.
*
* @param string directory to scan
* @param integer entry id - used only for recursion
* @param boolean ??? - used only for recursion
* @return array
*/
function browse($dir, $id = 0, $noindex = false)
{
$struct = array();
$dh = opendir($dir);
while ($file = readdir($dh)) {
if ('.' == $file || '..' == $file) {
continue;
}
$ffile = $dir . $file;
if (is_dir($ffile)) {
$ffile .= '/';
if (file_exists($ffile . $this->index_file)) {
$id++;
$struct[$this->id_prefix . $id]['url'] = $ffile . $this->index_file;
$sub = $this->browse($ffile, $id + 1, true);
if (0 != count($sub)) {
$struct[$this->id_prefix . $id]['sub'] = $sub;
}
}
} else {
if ($this->file_suffix == substr($file, strlen($file) - $this->file_suffix_length, $this->file_suffix_length)
&& !($noindex && $this->index_file == $file) )
{
$id++;
$struct[$this->id_prefix . $id]['url'] = $dir . $file;
}
}
}
return $struct;
}
/**
* Adds further informations to the menu hash gathered from the files in it
*
* @param array Menu hash to examine
* @return array Modified menu hash with the new informations
*/
function addFileInfo($menu)
{
// no foreach - it works on a copy - the recursive
// structure requires already lots of memory
reset($menu);
while (list($id, $data) = each($menu)) {
$menu[$id] = array_merge($data, $this->exploreFile($data['url']));
if (isset($data['sub'])) {
$menu[$id]['sub'] = $this->addFileInfo($data['sub']);
}
}
return $menu;
}
/**
* Returns additional menu informations decoded in the file that appears in the menu.
*
* You should subclass this method to make it work with your own
* file formats. I used a simple XML format to store the content.
*
* @param string filename
*/
function exploreFile($file)
{
$xml = join('', @file($file));
if (!$xml) {
return array();
}
$doc = xmldoc($xml);
$xpc = xpath_new_context($doc);
$menu = xpath_eval($xpc, '//menu');
$node = &$menu->nodeset[0];
return array('title' => $node->content);
}
}
?>